package com.shinbada.modules.sys.mapper;

import com.shinbada.core.persistence.BaseMapper;
import com.shinbada.modules.sys.entity.Office;
import com.shinbada.modules.sys.entity.Post;
import com.shinbada.modules.sys.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * 用户MAPPER接口
 *
 * @author initcap
 * @version 2017-05-16
 */
@Mapper
@Repository
public interface UserMapper extends BaseMapper<User> {

    /**
     * 根据登录名称查询用户
     *
     * @param user 用户
     * @return 用户
     */
    User getByLoginName(User user);

    /**
     * 根据工号获取用户
     *
     * @param user 用户
     * @return 用户
     */
    User getByNo(User user);

    /**
     * 通过OfficeId获取用户列表，仅返回用户id和name（树查询用户时用）
     *
     * @param user 用户
     * @return 用户集合
     */
    List<User> findUserByOfficeId(User user);

    /**
     * 根据岗位编号获取用户信息
     *
     * @param user 用户
     * @return 用户集合
     */
    List<User> findUserByPostId(User user);

    /**
     * 查询全部用户数目
     *
     * @param user 用户
     * @return 用户数量
     */
    long findAllCount(User user);

    /**
     * 更新用户密码
     *
     * @param user 用户
     * @return 成功条数
     */
    int updatePasswordById(User user);

    /**
     * 更新登录信息，如：登录IP、登录时间
     *
     * @param user 用户
     * @return 成功条数
     */
    int updateLoginInfo(User user);

    /**
     * 删除用户角色关联数据
     *
     * @param user 用户
     * @return 成功条数
     */
    int deleteUserRole(User user);

    /**
     * 插入用户角色关联数据
     *
     * @param user 用户
     * @return 1 成功
     */
    int insertUserRole(User user);

    /**
     * 更新用户信息
     *
     * @param user 用户
     * @return 成功条数
     */
    int updateUserInfo(User user);

    /**
     * 根据机构查询用户
     *
     * @param user 用户信息
     * @return 用户集合
     */
    List<User> findListByOffice(User user);

    /**
     * 更新用户域信息
     *
     * @param userId  用户主键
     * @param domains 域信息
     */
    void updateUserDomains(@Param("userId") String userId, @Param("domains") String domains);

    /**
     * 统计登录名
     *
     * @param id        主键
     * @param loginName 登录名称
     * @return 个数
     */
    int countLoginNameExist(@Param("id") String id, @Param("loginName") String loginName);

    /**
     * 根据部门-岗位-用户进行查询用户，如果指定了用户那么就只返回当前用户
     *
     * @param office 部门
     * @param post   岗位
     * @param user   用户
     * @return 集合
     */
    List<User> listByOfficeAndPostAndUser(@Param("office") Office office, @Param("post") Post post, @Param("user") User user);

    /**
     * 统计部门下用户个数
     *
     * @param id 部门主键
     * @return 个数
     */
    int countOfficeId(@Param("id") String id);

    /**
     * 统计岗位下用户个数
     *
     * @param id 岗位主键
     * @return 个数
     */
    int countPostId(@Param("id") String id);

    /**
     * 根据岗位删除用户
     *
     * @param id 岗位主键
     */
    void deleteUserByPostId(@Param("id") String id);

    /**
     * 根据机构删除用户
     *
     * @param id 机构主键
     */
    void deleteUserByOfficeId(@Param("id") String id);

    /**
     * 记录输错密码次数
     *
     * @param userId 用户主键
     */
    void addErrInputPassword(@Param("userId") String userId);

    /**
     * 修改用户登录开关
     *
     * @param id        主键
     * @param loginFlag 开关设置
     */
    void changeLoginFlag(@Param("id") String id, @Param("loginFlag") String loginFlag);

    /**
     * 统计No数量
     *
     * @param id 主键
     * @param no No号
     * @return 个数
     */
    int countNoExist(@Param("id") String id, @Param("no") String no, @Param("companyId") String companyId);

    /**
     * 统计用户名
     *
     * @param id   主键
     * @param name 用户名称
     * @return 个数
     */
    int countNameExist(@Param("id") String id, @Param("name") String name);

    /**
     * 清理指定机构的数据
     *
     * @param companyId 机构标识
     */
    void clearCompanyId(@Param("companyId") String companyId);
}
